package com.hmall.cart.controller;

import com.hmall.cart.domain.dto.CartFormDTO;
import com.hmall.cart.domain.po.Cart;
import com.hmall.cart.domain.vo.CartVO;
import com.hmall.cart.service.ICartService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

/**
 * 购物车控制器
 * 处理购物车相关的HTTP请求
 * 提供添加、查询、修改、删除购物车商品等接口
 */
@Api(tags = "购物车相关接口")
@RestController
@RequestMapping("/carts")
@RequiredArgsConstructor
public class CartController {

    private final ICartService cartService;  // 购物车业务逻辑服务

    /**
     * 添加商品到购物车
     * @param cartFormDTO 商品表单DTO，包含商品ID、数量等信息
     */
    @ApiOperation("添加商品到购物车")
    @PostMapping
    public void addItem2Cart(@Valid @RequestBody CartFormDTO cartFormDTO) {
        // 调用服务层方法添加商品到购物车
        // @Valid：触发JSR-303参数校验
        // @RequestBody：从请求体中解析JSON数据
        cartService.addItem2Cart(cartFormDTO);
    }

    /**
     * 更新购物车数据
     * @param cart 购物车实体，包含需要更新的字段
     */
    @ApiOperation("更新购物车数据")
    @PutMapping  // PUT请求，路径：/carts
    public void updateCart(@RequestBody Cart cart) {
        // 根据ID更新购物车数据
        // 注意：需确保请求中包含有效的ID
        cartService.updateById(cart);
    }

    /**
     * 删除购物车中商品
     * @param id 购物车条目ID
     */
    @ApiOperation("删除购物车中商品")
    @DeleteMapping("{id}")  // DELETE请求，路径：/carts/{id}
    public void deleteCartItem(@PathVariable("id") Long id) {
        // 根据购物车条目ID删除商品
        // @PathVariable：从路径变量中获取参数值
        cartService.removeById(id);
    }

    /**
     * 查询购物车列表
     * @return 购物车VO列表，包含商品实时信息
     */
    @ApiOperation("查询购物车列表")
    @GetMapping  // GET请求，路径：/carts
    public List<CartVO> queryMyCarts() {
        // 查询当前用户的购物车列表
        // 返回VO对象列表，包含商品最新信息（价格、库存等）
        return cartService.queryMyCarts();
    }

    /**
     * 批量删除购物车中商品
     * @param ids 购物车条目ID集合
     */
    @ApiOperation("批量删除购物车中商品")
    @ApiImplicitParam(name = "ids", value = "购物车条目ID集合")
    @DeleteMapping  // DELETE请求，路径：/carts?ids=1,2,3
    public void deleteCartItemByIds(@RequestParam("ids") List<Long> ids) {
        // 批量删除购物车商品
        // @RequestParam：从查询参数中获取参数值，如?ids=1,2,3
        cartService.removeByItemIds(ids);
    }
}